package 多线程;

/*
   线程的常用方法
    1、void start():启动当前线程,并执行当前线程的run()方法
    2、run():线程在被调度时执行的操作,将创建的线程要执行的操作声明在此方法中
    3、String getName():返回线程的名称
    4、void setName(String name):设置该线程名称
    5、static Thread currentThread():返回当前线程,在Thread子类中就是this,通常用于主线程和Runnable实现类
    6、static void yield():线程让步,释放当前CPU的执行权
        暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程(有可能释放后又让给了自己)
        若队列中没有同优先级的线程,忽略此方法
    7、join():当某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到join()方法加入的join线程执行完成后该线程才会继续执行(CPU不是完全执行join方法加入的线程,而是仍然随机分配,直至该线程执行完成)
        注:低优先级的线程也可以获得执行
    8、static void sleep(long millis):(指定时间:毫秒)
        令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后重新排队,即不是睡眠时间到了立即执行,重新分配到了才可以
        抛出InterruptedException异常
    9、boolean isAlive():返回boolean,判断当前线程是否还活着
 */

public class ThreadTest02 {
    public static void main(String[] args) {
        MyThread02 mt = new MyThread02();
        //设置该线程名称
        mt.setName("线程一:");
        mt.start();

        //设置主线程名称
        Thread.currentThread().setName("主线程:");
        System.out.println(Thread.currentThread().getName());

        new MyThread02("构造器设置线程名:").start();

        for(int i = 0; i < 10; i ++){
            System.out.println(i);
            if(i == 5){
                try {
                    mt.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class MyThread02 extends Thread{

    //通过构造器方式设置线程名称
    public MyThread02(String name){
        super(name);
    }

    public MyThread02(){}

    @Override
    public void run() {
        //yield(); //释放当前CPU的执行权

        try {
            Thread.currentThread().sleep(10000); //当前线程睡眠10秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //获取当前线程的名称
        System.out.println(Thread.currentThread().getName());
    }
}


